import router from '@/router/index'
import { isType } from '@/utils/is'
import { LOGIN_URL } from '@/config/app'
import { ElNotification } from 'element-plus'
import { useAuthMenuAndButtonStore } from '@/stores'
import { setToken } from '@/utils/token'
import { notFoundRouter } from '@/router-back/modules/staticRouter'

// 引入 views 文件夹下所有 vue 文件
const modules = import.meta.glob('@/views/**/*.vue')

/**
 * 初始化动态路由
 */
export const initDynamicRouter = async () => {
  const authStore = useAuthMenuAndButtonStore()
  try {
    // 1.获取菜单列表 && 按钮权限（可合并到一个接口获取，根据后端不同可自行改造）
    await authStore.getAuthRouteList()
    await authStore.getAuthButtonList()

    // 2.判断当前用户有没有能访问的动态路由权限
    if (!authStore.authRouteList.length) {
      ElNotification({
        title: '无权限访问',
        message: '当前账号无任何可访问的，请联系系统管理员！',
        type: 'warning',
        duration: 3000
      })
      setToken('')
      router.replace(LOGIN_URL)
      return Promise.reject('No permission')
    }

    // 3.添加动态路由
    authStore.flatRouteListGet.forEach((item: any) => {
      item.children && delete item.children
      if (item.component && isType(item.component) == 'string') {
        item.component = modules['/src/views' + item.component + '.vue']
      }
      if (item.meta.isFull) {
        router.addRoute(item)
      } else {
        router.addRoute('layout', item)
      }
    })

    // 4.最后添加 notFoundRouter
    router.addRoute(notFoundRouter)
  } catch (error) {
    // 💢 当按钮 || 菜单请求出错时，重定向到登陆页
    setToken('')
    router.replace(LOGIN_URL)
    return Promise.reject(error)
  }
}
